/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ UsuarioBean.java
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: German Sotelo
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.catalogo.beans;

import com.losalpes.catalogo.entities.TipoDocumento;
import com.losalpes.catalogo.entities.Usuario;
import com.losalpes.catalogo.excepciones.InvalidDataException;
import com.losalpes.catalogo.excepciones.InvalidOperationException;
import com.losalpes.catalogo.servicios.IUsuarioServicesLocal;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 * Clase encargada de facilitar la administración de usuarios
 * @author German Sotelo
 */
public class UsuarioBean {

    /**
     * Relación con la interfaz que provee los servicios necesarios relacionados con los usuarios.
     */
    @EJB
    private IUsuarioServicesLocal usuarioServices;

    /**
     * Mensaje utilizado para mostrar información importante al usuario.
     */
    private String mensaje;

    /**
     * Referencia al objeto que se está mostrando al cliente. En este objeto se almacenan los datos del cliente.
     */
    private Usuario usuario;

    /*
     * Constructor por defecto de backing bean de usuario.
     */
    public UsuarioBean() {
    }

    /**
     * Inicia el registro de un nuevo cliente.
     * @return
     */
    public String newUsuario(){
        usuario=usuarioServices.newUsuario();
        mensaje="";
        return "registro";
    }

    /**
     * Retorna el objeto que contiene los datos del cliente actual.
     * @return
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * Asigna al usuario actual los datos del usuario pasado por parámetro.
     * @param usuario
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * Método que retorna los tipos de documentos a ser visualizados para que el cliente escoja.
     * @return
     */
    public SelectItem[] getTiposDocumentos() {
        TipoDocumento[] tipos=  TipoDocumento.values();
        SelectItem[] sitems = new SelectItem[tipos.length];
        for (int i = 0; i < sitems.length; i++) {
             sitems[i] = new SelectItem(tipos[i]);
        }
        return sitems;
    }

    /**
     * Crea un usuario con los datos proporcionados por el cliente.
     * @return
     */
    public String registrarUsuario(){
        try{
            usuarioServices.crearUsuario(usuario);
            destroyBean();
            return "login";
        }catch(InvalidDataException ex){
            mensaje=ex.getMessage();
        }catch (InvalidOperationException ex) {
            mensaje=ex.getMessage();
        }
        return null;
    }

    /**
     * Actualiza los datos del usuario que representa al cliente.
     * @return
     */
    public String updateUsuario(){
        try {
            usuarioServices.updateUsuario(usuario);
            destroyBean();
            return "index";
        } catch (InvalidDataException ex) {
            mensaje=ex.getMessage();
        }
        return null;
        
    }

    /**
     * Retorna el mensaje que contiene información importante para el cliente.
     * @return
     */
    public String getMensaje() {
        return mensaje;
    }

    /**
     * Mètodo que remueve este bean del contexto.
     */
    public void destroyBean() {
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("UsuarioBean");
    }

    /**
     * Mètodo que toma el usuario que se ha autenticado durante la sesión en curso y lo asigna para ser editado.
     * @return
     */
    public String editarUsuario(){
        if(FacesContext.getCurrentInstance().getExternalContext().getSessionMap().containsKey("SecurityBean")){
            SecurityBean sessionSecurity = (SecurityBean)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("SecurityBean");
            Usuario user = sessionSecurity.getUser();
            if(user!=null){
                usuario=user;
                mensaje="";
                return "editar";
            }
        }
        mensaje = "Usted no se ha autenticado, debe hacerlo para modificar sus datos.";
        return null;
    }

}
